//package com.bayern.muchen.more_test.compleatable;
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.sctel10000.miniApp.busHandler.dao.WidePrefectureNewDao;
//import com.sctel10000.miniApp.client.interfaceCall.ICustomerProductDataInquiryFeignClient;
//import com.sctel10000.miniApp.client.redis.RedisCommonClient;
//import com.sctel10000.miniApp.client.redis.ThirdSessionClient;
//import com.sctel10000.miniApp.commons.constants.failuresRepair.FailuresRepairConstant;
//import com.sctel10000.miniApp.commons.constants.global.RetKeyConstant;
//import com.sctel10000.miniApp.commons.constants.user.AccNbrTypeConstant;
//import com.sctel10000.miniApp.commons.constants.user.TelTypeConstants;
//import com.sctel10000.miniApp.commons.enumeration.RetCodeEnum;
//import com.sctel10000.miniApp.entity.login.BindInfoDTO;
//import com.sctel10000.miniApp.entity.login.LoginUser;
//import com.sctel10000.miniApp.tools.DateUtil;
//import com.sctel10000.miniApp.tools.JsonUtil;
//import com.sctel10000.miniApp.tools.Tools;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.core.task.TaskExecutor;
//import org.springframework.stereotype.Service;
//import org.springframework.util.CollectionUtils;
//
//import java.math.BigDecimal;
//import java.util.*;
//import java.util.concurrent.CompletableFuture;
//import java.util.stream.Collectors;
//
///**
// * @author youyunhao
// * @date 2021/10/8 17:14
// * @description: 新版宽带专区Service
// */
//@Service
//public class WidePrefectureNewService {
//    /**
//     * 日志记录
//     */
//    private Logger log = LogManager.getLogger(getClass());
//
//    @Autowired
//    private ThirdSessionClient thirdSessionClient;
//    @Autowired
//    private ICustomerProductDataInquiryFeignClient customerClient;
//    @Autowired
//    private FailuresRepairService failuresRepairService;
//    @Autowired
//    private WidePrefectureNewDao widePrefectureNewDao;
//    @Autowired
//    private TaskExecutor taskExecutor;
//    @Autowired
//    private RedisCommonClient redisCommonClient;
//
//    /**
//     * 时间格式
//     */
//    private static final String CALL_TIME_FORMATTER = "yyyyMMddHHmmss";
//    private static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss";
//    /**
//     * 问候语缓存key
//     */
//    private static final String GREETING_WORDS_KEY = "broadband_greeting:";
//    /**
//     * 光猫重置用存宽带列表key
//     */
//    private static final String RESET_WIDE_KEY = "broadband_resetLc_list";
//
//    /**
//     * 过期时间：1小时
//     */
//    private static final Long EXPIRE_TIME = 60 * 60L;
//
//    /**
//     * 固定标签配置查询类型
//     */
//    private static final List<String> STATIC_TAG_CONFIG = Arrays.asList("2", "3", "4");
//
//    /**
//     * 智慧家庭和为你推荐模块区分id
//     */
//    // 智慧家庭
//    private static final String INTELLECTUAL_MODULE = "0";
//    // 为你推荐
//    private static final String RECOMMEND_MODULE = "1";
//
//
//    /**
//     * 获取用户信息
//     *
//     * @param thirdSession
//     * @return
//     */
//    public JSONObject getUserInfo(String thirdSession) {
//        LoginUser loginUser = thirdSessionClient.getThirdSession(thirdSession).getDto();
//        List<BindInfoDTO> bindWides = loginUser.getWide();
//        String unionId = loginUser.getUnionid();
//        JSONObject retJson = new JSONObject();
//        if (CollectionUtils.isEmpty(bindWides)) {
//            log.info("widePrefecture >> {} >> 未绑定宽带！", unionId);
//            return JsonUtil.packagParamByEnum(RetCodeEnum.NOT_BIND_WIDE);
//        }
//        // 每个宽带的信息列表
//        List<JSONObject> wideInfoList = new ArrayList<>();
//        // 异步组合查询每个宽带的信息
//        CompletableFuture[] futures = new CompletableFuture[bindWides.size()];
//        // 缓存用宽带列表
//        Map<String, Map<String, String>> resetWideData = new HashMap<>();
//        int count = 0;
//        for (BindInfoDTO wide : bindWides) {
//            int index = count;
//            futures[count] = CompletableFuture.runAsync(() -> this.dealWideInfo(wide, wideInfoList, index, resetWideData), taskExecutor);
//            count++;
//        }
//        redisCommonClient.hset(RESET_WIDE_KEY, unionId, resetWideData, EXPIRE_TIME);
//        CompletableFuture.allOf(futures).join();
//        retJson.put("wideInfoList", wideInfoList);
//        // 查询标签配置信息
//        retJson.put("showConfig", this.getTagConfigInfo(STATIC_TAG_CONFIG, true));
//        return JsonUtil.packagParamByEnum(RetCodeEnum.SUCCESS, retJson);
//    }
//
//    /**
//     * 处理查询宽带相关信息
//     *
//     * @param wide          宽带
//     * @param wideInfoList  宽带信息集合
//     * @param index         宽带下标
//     * @param resetWideData 重启光猫用宽带列表
//     */
//    private void dealWideInfo(BindInfoDTO wide, List<JSONObject> wideInfoList, int index, Map<String, Map<String, String>> resetWideData) {
//        JSONObject wideInfo = new JSONObject();
//        String wideAccNbr = wide.getAccNbr();
//        String cityCode = wide.getCityCode();
//
//        // 查询客户资料
//        JSONObject customInfo = customerClient.customerDataInquiryByAccNbr(wideAccNbr, AccNbrTypeConstant.WIDE_TYPE, "1,2,3,4", cityCode);
//        if (!RetCodeEnum.SUCCESS.getRetCode().equals(customInfo.getString(RetKeyConstant.RETCODE))) {
//            log.info("{} >> 查询客户资料接口失败！", wideAccNbr);
//            return;
//        }
//        // 带宽
//        String bandWidth = customInfo.getString("bandwidth");
//        // 接入号
//        String accessNum = customInfo.getString("accessNum");
//        // 地址
//        String address = customInfo.getString("address");
//
//        // 是否接入光纤（1：是，0：不是）
//        String isFtth = failuresRepairService.isFtth(wideAccNbr, cityCode);
//        // 查询流水号
//        String searchNo = Tools.generateTradeNo();
//        // 查询光猫温度
//        CompletableFuture<Void> ftthTemperature = CompletableFuture.runAsync(() -> this.getFtthTemperature(wideInfo, accessNum,
//                isFtth, cityCode, searchNo, wideAccNbr), taskExecutor);
//        // 查询接入设备
//        CompletableFuture<Void> accessEquipInfo = CompletableFuture.runAsync(() -> this.getAccessEquipInfo(wideInfo, accessNum,
//                isFtth, cityCode, searchNo, wideAccNbr), taskExecutor);
//
//        CompletableFuture.allOf(ftthTemperature, accessEquipInfo).join();
//
//        wideInfo.put("bandWidth", bandWidth);
//        wideInfo.put("index", index);
//        wideInfo.put("address", Tools.address(address));
//        wideInfo.put("wideAccnbr", Tools.packageAccNbr(wideAccNbr));
//        // 处理带宽的配置信息
//        dealBandWidthConfig(bandWidth, wideInfo);
//        // 信息存redis
//        Map<String, String> wideMap = new HashMap<>();
//        wideMap.put("wideAccnbr", wideAccNbr);
//        wideMap.put("cityCode", wide.getCityCode());
//        wideMap.put("accessNum", accessNum);
//        wideMap.put("isFtth", isFtth);
//        resetWideData.put(String.valueOf(index), wideMap);
//        wideInfoList.add(wideInfo);
//    }
//
//    /**
//     * 处理带宽的配置信息
//     *
//     * @param bandWidth 带宽（例：100M）
//     * @param wideInfo
//     */
//    private void dealBandWidthConfig(String bandWidth, JSONObject wideInfo) {
//        // 获取带宽配置信息
//        JSONArray bandWidthConf = this.getTagConfigInfo(Collections.singletonList(TelTypeConstants.BIND_ONET_USER),
//                false).getJSONArray("tagConfig");
//        // 带宽字符转换为数字
//        int bandWidthValue;
//        try {
//            bandWidthValue = Integer.valueOf(bandWidth.substring(0, bandWidth.length() - 1));
//        } catch (Exception e) {
//            log.error("带宽转换值异常！");
//            return;
//        }
//        // 千兆带宽区别不同配置
//        for (int i = 0; i < bandWidthConf.size(); i++) {
//            String tagId = bandWidthConf.getJSONObject(i).getString("TAGID");
//            if (bandWidthValue >= 1000) {
//                if (TelTypeConstants.BIND_ONET_USER.equals(tagId)) {
//                    wideInfo.put("tagConfig", bandWidthConf.getJSONObject(i));
//                }
//            } else {
//                if (TelTypeConstants.BIND_NO_USER.equals(tagId)) {
//                    wideInfo.put("tagConfig", bandWidthConf.getJSONObject(i));
//                }
//            }
//        }
//    }
//
//    /**
//     * 查询光猫温度
//     *
//     * @param wideInfo
//     * @param accessNum
//     * @param isFtth
//     * @param cityCode
//     * @param searchNo
//     * @param wideAccNbr
//     */
//    private void getFtthTemperature(JSONObject wideInfo, String accessNum, String isFtth, String cityCode,
//                                    String searchNo, String wideAccNbr) {
//        JSONObject temperatureInfo = failuresRepairService.getObstacleResult(accessNum, isFtth, FailuresRepairConstant.ACCESS_NUMTYPE,
//                FailuresRepairConstant.COMBFUNC_FUNCTYPE, FailuresRepairConstant.TEMP_FUNCNAME, cityCode, searchNo, new JSONObject());
//        if (temperatureInfo == null) {
//            log.info("{} >> 查询光猫温度失败！", wideAccNbr);
//            wideInfo.put("tempRetCode", RetCodeEnum.EXCEPTION.getRetCode());
//        } else {
//            wideInfo.put("tempRetCode", RetCodeEnum.SUCCESS.getRetCode());
//            String temperature = temperatureInfo.getJSONObject("ResultInfo").getString("tempavg");
//            final boolean flag = StringUtils.isNotEmpty(temperature) && !temperature.contains("[");
//            // 默认展示48℃
//            temperature = flag ? temperature : "48.0";
//            int status = new BigDecimal(temperature).intValue() >= 60 ? 1 : 0;
//            wideInfo.put("temperature", temperature);
//            wideInfo.put("status", status);
//        }
//    }
//
//    /**
//     * 获取设备信息
//     *
//     * @param wideInfo
//     * @param accessNum
//     * @param isFtth
//     * @param cityCode
//     * @param searchNo
//     * @param wideAccNbr
//     */
//    private void getAccessEquipInfo(JSONObject wideInfo, String accessNum, String isFtth, String cityCode,
//                                    String searchNo, String wideAccNbr) {
//        JSONObject accessEquipInfo = failuresRepairService.getObstacleResult(accessNum, isFtth, FailuresRepairConstant.ACCESS_NUMTYPE,
//                FailuresRepairConstant.COMBFUNC_FUNCTYPE, FailuresRepairConstant.ACCESS_EQUIPMENT_FUNCNAME, cityCode, searchNo, new JSONObject());
//        if (accessEquipInfo == null) {
//            log.info("{} >> 查询接入设备失败！", wideAccNbr);
//            wideInfo.put("accEquipRetCode", RetCodeEnum.EXCEPTION.getRetCode());
//        } else {
//            JSONArray homeDevicesArr = new JSONArray();
//            Object homeDivices = accessEquipInfo.getJSONObject("ResultInfo").get("homedevices");
//            if (homeDivices == null) {
//                log.info("{} >> 查询设备信息为空：{}", wideAccNbr, accessEquipInfo);
//                return;
//            }
//            // 判断是json还是array
//            if (homeDivices instanceof List) {
//                homeDevicesArr.addAll((ArrayList) homeDivices);
//            } else {
//                homeDevicesArr.add(accessEquipInfo.getJSONObject("ResultInfo").getJSONObject("homedevices").getJSONObject("homedevice"));
//            }
//            if (homeDevicesArr.size() > 0) {
//                wideInfo.put("accEquipRetCode", RetCodeEnum.SUCCESS.getRetCode());
//                for (int i = homeDevicesArr.size() - 1; i >= 0; i--) {
//                    JSONObject homeDevices = homeDevicesArr.getJSONObject(i);
//                    // 处理时间
//                    String upTime = homeDevices.getString("uptime");
//                    if (upTime != null && upTime.length() > 14) {
//                        upTime = upTime.substring(0, 14);
//                    }
//                    homeDevices.put("uptime", DateUtil.formateAppointTime(upTime, CALL_TIME_FORMATTER, FORMAT_TIME));
//                    String macName = this.getMacName(homeDevices.getString("macType"));
//                    if ("[]".equals(macName)) {
//                        homeDevicesArr.remove(i);
//                        continue;
//                    }
//                    homeDevices.put("macName", macName);
//                }
//            }
//            wideInfo.put("accEquipArray", homeDevicesArr);
//        }
//    }
//
//    /**
//     * 获取标签及公告配置信息
//     *
//     * @param needQueryType 需要的查询类型
//     * @param needGreeting  是否需要问候语（true：需要 false：不需要）
//     * @return
//     */
//    private JSONObject getTagConfigInfo(List<String> needQueryType, Boolean needGreeting) {
//        JSONObject retJson = new JSONObject();
//        List<JSONObject> AllConfigs = widePrefectureNewDao.getTagConfig();
//        JSONArray tagConfig = new JSONArray();
//        JSONArray noticeConfig = new JSONArray();
//        JSONArray modelConfig = new JSONArray();
//        JSONArray netServiceConfList = new JSONArray();
//        JSONObject netServiceConfig = new JSONObject();
//        for (JSONObject config : AllConfigs) {
//            String queryType = config.getString("QUERYTYPE");
//            String tagId = config.getString("TAGID");
//            if (TelTypeConstants.BIND_ONET_USER.equals(queryType) && needQueryType.contains(TelTypeConstants.BIND_ONET_USER)) {
//                tagConfig.add(config);
//            } else if (TelTypeConstants.BIND_NO_USER.equals(queryType) && needQueryType.contains(TelTypeConstants.BIND_NO_USER)) {
//                noticeConfig.add(config);
//            } else if (TelTypeConstants.ALL_USER.equals(queryType) && needQueryType.contains(TelTypeConstants.ALL_USER)) {
//                modelConfig.add(config);
//            } else if (TelTypeConstants.BIND_ANY_USER.equals(queryType) && needQueryType.contains(TelTypeConstants.BIND_ANY_USER)) {
//                // 网络服务配置更多tagId：14
//                if ("14".equals(tagId)) {
//                    netServiceConfig.put("nerServiceMore", config);
//                } else {
//                    netServiceConfList.add(config);
//                    netServiceConfig.put("nerServiceList", netServiceConfList);
//                }
//            }
//            config.remove("QUERYTYPE");
//        }
//        if (needGreeting) {
//            retJson.put("greetingWords", redisCommonClient.getString2(GREETING_WORDS_KEY));
//        }
//        retJson.put("tagConfig", tagConfig);
//        retJson.put("noticeConfig", noticeConfig);
//        retJson.put("modelConfig", modelConfig);
//        retJson.put("netServiceConfig", netServiceConfig);
//        return retJson;
//    }
//
//    /**
//     * 根据设备类型返回设备名称
//     *
//     * @param macType 设备类型
//     * @return
//     */
//    private String getMacName(String macType) {
//        String macName = "";
//        switch (macType) {
//            case "1":
//                macName = "路由器";
//                break;
//            case "2":
//                macName = "机顶盒";
//                break;
//            case "3":
//                macName = "电脑";
//                break;
//            case "4":
//                macName = "手机";
//                break;
//            case "5":
//                macName = "Ipad";
//                break;
//            case "6":
//                macName = "网络电视盒";
//                break;
//            case "01":
//                macName = "标清机顶盒";
//                break;
//            case "02":
//                macName = "高清机顶盒";
//                break;
//            case "20":
//                macName = "智能电视";
//                break;
//            case "91":
//                macName = "超高清4K智能机顶盒";
//                break;
//            case "92":
//                macName = "高清2K智能机顶盒";
//                break;
//            default:
//                macName = macType;
//        }
//        return macName;
//    }
//
//    /**
//     * 获取智慧家庭及为你推荐配置
//     *
//     * @return
//     */
//    public JSONObject intelFamAndRecommend() {
//        JSONObject retJson = new JSONObject();
//        // 获取所有的配置信息
//        List<JSONObject> allFARConfig = widePrefectureNewDao.getAllFARConfig();
//        // 区别智慧家庭和为你推荐模块
//        List<JSONObject> intellectualConf = allFARConfig.stream().
//                filter(config -> config.getString("module").equals(INTELLECTUAL_MODULE)).collect(Collectors.toList());
//        List<JSONObject> recommendConf = allFARConfig.stream().
//                filter(config -> config.getString("module").equals(RECOMMEND_MODULE)).collect(Collectors.toList());
//        retJson.put("intellectualConf", intellectualConf);
//        retJson.put("recommendConf", recommendConf);
//        return JsonUtil.packagParamByEnum(RetCodeEnum.SUCCESS, retJson);
//    }
//
//    /**
//     * 重启光猫
//     *
//     * @param thirdSession
//     * @param index
//     * @return
//     */
//    public JSONObject resetLightCat(String thirdSession, String index) {
//        String unionId = thirdSessionClient.getThirdSession(thirdSession).getDto().getUnionid();
//        Map<String, Map<String, String>> resetData;
//        try {
//            // 获取缓存中宽带信息
//            resetData = (Map<String, Map<String, String>>) redisCommonClient.hget(RESET_WIDE_KEY, unionId);
//            if (CollectionUtils.isEmpty(resetData)) {
//                log.info("获取缓存宽带列表失败：{}", unionId);
//                return JsonUtil.packagParamByEnum(RetCodeEnum.EXCEPTION);
//            }
//        } catch (Exception e) {
//            log.error("{} >> 获取缓存宽带列表异常！", unionId, e);
//            return JsonUtil.packagParamByEnum(RetCodeEnum.EXCEPTION);
//        }
//        Map<String, String> wideMap = resetData.get(index);
//        if (CollectionUtils.isEmpty(wideMap)) {
//            log.info("{} >> 获取对应宽带信息为空：{}", unionId, resetData);
//            return JsonUtil.packagParamByEnum(RetCodeEnum.FAIL);
//        }
//        String wideAccnbr = wideMap.get("wideAccnbr");
//        String cityCode = wideMap.get("cityCode");
//        String accessNum = wideMap.get("accessNum");
//        String isFtth = wideMap.get("isFtth");
//        // 修复流水号
//        String serialId = Tools.generateTradeNo();
//
//        // 查询5分内是否有重启成功记录
//        if (widePrefectureNewDao.qryIsResetInFiveMinutes(unionId, wideAccnbr)) {
//            log.info("{} >> 查询有成功重启记录！", wideAccnbr);
//            return JsonUtil.packagParam("2", "已重启成功！");
//        }
//
//        // 重启光猫接口
//        JSONObject resetResult = failuresRepairService.getObstacleResult(accessNum, isFtth, FailuresRepairConstant.ACCESS_NUMTYPE,
//                FailuresRepairConstant.COMBFUNC_FUNCTYPE, FailuresRepairConstant.DIAGNOSIS_FUNCNAME_RESTART, cityCode, serialId, new JSONObject());
//        if (resetResult == null) {
//            log.info("{} >> 重启光猫失败！", wideAccnbr);
//            // 失败记录入库
//            widePrefectureNewDao.insertResetResult(serialId, unionId, wideAccnbr, accessNum, cityCode, isFtth,
//                    RetCodeEnum.NULL.getRetCode());
//            return JsonUtil.packagParamByEnum(RetCodeEnum.FAIL);
//        }
//        widePrefectureNewDao.insertResetResult(serialId, unionId, wideAccnbr, accessNum, cityCode, isFtth,
//                resetResult.getString("Result"));
//        return JsonUtil.packagParamByEnum(RetCodeEnum.SUCCESS);
//    }
//}
